package com.example.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.domain.StudyRoomReservation;

import java.sql.Time;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author HP
 * @description 针对表【study_room_reservation】的数据库操作Service
 * @createDate 2025-08-26 19:30:00
 */
public interface StudyRoomReservationService extends IService<StudyRoomReservation> {

    /**
     * 创建座位预约
     * @param userId 用户ID
     * @param seatId 座位ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 是否预约成功
     */
    boolean createReservation(Long userId, Long seatId, Date startTime, Date endTime);

    /**
     * 取消预约
     * @param reservationId 预约ID
     * @param userId 用户ID（权限验证）
     * @param operatorId 操作人ID
     * @param operatorName 操作人名称
     * @param ip IP地址
     * @return 是否取消成功
     */
    boolean cancelReservation(Long reservationId, Long userId, Long operatorId, 
                             String operatorName, String ip);

    /**
     * 管理员强制取消预约
     * @param reservationId 预约ID
     * @param reason 取消原因
     * @param operatorId 操作人ID
     * @param operatorName 操作人名称
     * @param ip IP地址
     * @return 是否取消成功
     */
    boolean adminCancelReservation(Long reservationId, String reason, Long operatorId, 
                                  String operatorName, String ip);

    /**
     * 预约签到
     * @param reservationId 预约ID
     * @param userId 用户ID（权限验证）
     * @return 是否签到成功
     */
    boolean checkInReservation(Long reservationId, Long userId);

    /**
     * 管理员代替用户签到
     * @param reservationId 预约ID
     * @param operatorId 操作管理员ID
     * @param operatorName 操作管理员名称
     * @param ip IP地址
     * @return 是否签到成功
     */
    boolean adminCheckInReservation(Long reservationId, Long operatorId, String operatorName, String ip);

    /**
     * 查询用户的预约记录
     * @param userId 用户ID
     * @return 预约记录列表
     */
    List<StudyRoomReservation> getUserReservations(Long userId);

    /**
     * 查询座位的预约记录
     * @param seatId 座位ID
     * @param startDate 开始日期（可选）
     * @param endDate 结束日期（可选）
     * @return 预约记录列表
     */
    List<StudyRoomReservation> getSeatReservations(Long seatId, Date startDate, Date endDate);

    /**
     * 检查时间冲突
     * @param seatId 座位ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param excludeReservationId 排除的预约ID（用于更新时检查）
     * @return 是否存在冲突
     */
    boolean checkTimeConflict(Long seatId, Date startTime, Date endTime, Long excludeReservationId);

    /**
     * 获取座位预约统计信息
     * @param seatId 座位ID
     * @param date 日期（可选，默认今天）
     * @return 统计信息
     */
    Map<String, Object> getReservationStatistics(Long seatId, Date date);

    /**
     * 检查预约是否可以取消
     * @param reservationId 预约ID
     * @param userId 用户ID
     * @return 检查结果
     */
    Map<String, Object> canCancelReservation(Long reservationId, Long userId);

    /**
     * 检查用户是否可以签到
     * @param reservationId 预约ID
     * @param userId 用户ID
     * @return 检查结果
     */
    Map<String, Object> canCheckInReservation(Long reservationId, Long userId);

    /**
     * 自动处理超时预约
     * @return 处理的记录数
     */
    int processTimeoutReservations();

    /**
     * 获取当前有效的预约记录
     * @param seatId 座位ID
     * @return 当前有效预约（如果存在）
     */
    StudyRoomReservation getCurrentReservation(Long seatId);

    /**
     * 批量取消用户预约
     * @param userId 用户ID
     * @param reason 取消原因
     * @param operatorId 操作人ID
     * @param operatorName 操作人名称
     * @param ip IP地址
     * @return 取消的记录数
     */
    int batchCancelUserReservations(Long userId, String reason, Long operatorId, 
                                   String operatorName, String ip);
}